package xyz.xxpc.springcloud.consumer.hystrix.web;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import xyz.xxpc.springcloud.pojo.User;
import xyz.xxpc.springcloud.service.api.UserService;

@RestController
public class UserHystrixController {

    // 使用RestTemplate访问服务提供者
    private RestTemplate restTemplate;

    private UserService userService;

    @Autowired
    public void setRestTemplate(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/user/feign_info")
    // 此处就不需要再自动调用的时候 处理 而是统一处理
//    @HystrixCommand(fallbackMethod = "queryUserFail")
    public User queryUserByFeignClient(Integer id){
        return userService.query(id);
    }

    // 根据id查询用户信息
    @GetMapping("/user/info")
    // 熔断处理 -- 指定失败后的处理方法
    @HystrixCommand(fallbackMethod = "queryUserFail")
    public User queryUserById(Integer id){
        return restTemplate.getForObject("http://PROVIDER-30080/user/" + id,User.class);
    }

    /**
     * 当查询用户失败的处理方法
     * @return
     */
    public User queryUserFail(Integer id){
        // 直接返回一个没有数据的user对象
        return new User().setId(id);
    }
}
